// ------------------- 整理排产计划配置 -------------------

// 灯值：允许任意颜色 → 0-100 的亮度
/**
 * @typedef {object} LightValues
 * @property {number} [白光]   0-100
 * @property {number} [蓝光]   0-100
 * @property {number} [红光]   0-100
 * @property {number} [亮度]   0-100
 * 可扩展其它颜色
 */

/**
 * 一个任务（时间段 + 设备 + 亮度）
 * @typedef {object} LightTask
 * @property {[string, string]} timeRange  开始、结束时间，格式 HH:mm:ss
 * @property {string[]}         devices    要控制的设备名称列表
 * @property {LightValues}      values     各颜色亮度
 */

/**
 * 灯光组完整结构
 * @typedef {object} LightGroup
 * @property {string}        name      组名称
 * @property {string}        oldName   旧名称（空字符串表示新建）
 * @property {boolean|0|1}       enabled   是否启用
 * @property {LightTask[]}   tasks     任务列表
 */

/**
 * 排产计划任务
 * @typedef {object} APSTasks
 * @property {string}        name      任务名称
 * @property {string}        oldName   旧名称（空字符串表示新建）
 * @property {boolean|0|1}       enabled   是否启用
 * @property {string}        startDate    开始日期，格式 YYYY-MM-DD
 * @property {string}        endDate      结束日期，格式 YYYY-MM-DD
 * @property {{tasks: LightTask[]}}   [调光组配置]     任务列表
 */

/**
 * 排产计划结构
 * @typedef {object} APSPlan
 * @property {string}        name      计划名称
 * @property {string}        oldName   旧名称（空字符串表示新建）
 * @property {boolean|0|1}       enabled   是否启用
 * @property {APSTasks[]}  tasks    生产阶段任务
 *
 */

// 获取本地配置
const _gConfig = msg._flowConf || msg.payload || {};

// node.warn(_g_config)

// 处理排产计划配置
/**
 * @type {APSPlan[]}
 */
let _gAPSConf = _gConfig['排产计划配置'];
if (!_gAPSConf) {
  _gAPSConf = [];
}

if (!Array.isArray(_gAPSConf)) {
  _gAPSConf = [];
}

/**
 * @type {APSPlan}
 */
const apsConf = msg.payload['排产计划配置'];

if (Array.isArray(apsConf)) {
  // 直接覆盖
  _gAPSConf = apsConf;
} else if (typeof apsConf === 'object' && !Array.isArray(apsConf)) {
  if (_gAPSConf.length === 0) {
    _gAPSConf = [apsConf];
  } else {
    let _hasConf = false;
    for (let index = 0; index < _gAPSConf.length; index++) {
      const item = _gAPSConf[index];
      // 找到原来的直接替换
      if (item.name === apsConf.name) {
        _hasConf = true;
        _gAPSConf[index] = apsConf;
        break;
      }
    }

    // 不存在就直接添加
    if (!_hasConf) {
      _gAPSConf.push(apsConf);
    }
  }
}

// 坏数据过滤
_gAPSConf = _gAPSConf.reduce((/** @type {APSPlan[]} */ prev, item) => {
  if (!item.tasks || item.tasks.length === 0) {
    return prev;
  }
  prev.push({
    ...item,
  });
  return prev;
}, []);

const config = {
  ..._gConfig,
  ...msg.payload,
  排产计划配置: _gAPSConf,
};

msg.payload = config;

// 父节点配置
msg._flowConf = config;

return msg;


// ------------------- 整理排产计划配置 -------------------